const express = require('express')
const router = express.Router()
const sqlFn = require('../mysql')
const remove = require('loadsh/remove')

/**
 * @swagger
 * tags:
 *   - name: Menu
 *     description: 菜单管理接口
 */

/**
 * @swagger
 * /api/menu/add:
 *   post:
 *     summary: 添加菜单项
 *     description: 添加新的菜单项到数据库中。
 *     tags: [Menu]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               pid:
 *                 type: integer
 *                 description: 父菜单 ID，-1 表示顶级菜单。
 *                 example: -1
 *               name:
 *                 type: string
 *                 description: 菜单名称。
 *                 example: 新菜单项
 *               linkUrl:
 *                 type: string
 *                 description: 菜单链接地址。
 *                 example: "/home"
 *               openType:
 *                 type: string
 *                 description: 打开类型（如：_blank）。
 *                 example: "_self"
 *               icon:
 *                 type: string
 *                 description: 菜单图标。
 *                 example: "icon-home"
 *               isOfAdmin:
 *                 type: boolean
 *                 description: 是否为管理员菜单。
 *                 example: true
 *     responses:
 *       200:
 *         description: 添加成功，返回成功状态码。
 */
router.post('/add', function (req, res, next) {
    const sql = 'insert into menu values (null,?,?,?,?,?,?)'
    const { pid = -1, name, linkUrl, openType, icon, isOfAdmin } = req.body
    const arr = [pid, name, linkUrl, openType, icon, isOfAdmin]
    sqlFn(sql, arr, function (err, data) {
        if (err) {
            next(err)
            return
        }
        if (data.affectedRows) {
            res.send({ code: '00000', success: true })
        }
    })
})

/**
 * @swagger
 * /api/menu/list:
 *   get:
 *     summary: 获取菜单列表
 *     description: 返回完整的菜单项列表，并生成菜单树结构。
 *     tags: [Menu]
 *     responses:
 *       200:
 *         description: 返回菜单列表和树结构数据。
 */
router.get('/list', function (req, res, next) {
    const sql = 'select * from menu'
    sqlFn(sql, [], function (err, data) {
        if (err) {
            next(err)
            return
        }
        const getMenuTree = (menus = []) => {
            menus.map(item => {
                menus.map(menu => {
                    if (item.pid == menu.id) {
                        menu.children = menu.children || []
                        menu.children.push(item)
                    }
                })
            })
            remove(menus, (menu) => menu.pid != -1)
            return menus
        }
        res.send({ code: "200", records: getMenuTree(data) })
    })
})

/**
 * @swagger
 * /api/menu/getMenuName:
 *   get:
 *     summary: 获取菜单项名称
 *     description: 根据菜单 ID 获取对应的菜单名称。
 *     tags: [Menu]
 *     parameters:
 *       - name: id
 *         in: query
 *         required: true
 *         schema:
 *           type: integer
 *           description: 菜单项 ID。
 *           example: 1
 *     responses:
 *       200:
 *         description: 返回对应的菜单名称数据。
 */
router.get('/getMenuName', function (req, res, next) {
    const sql = 'select * from menu where `id`=?'
    sqlFn(sql, [req.query.id], function (err, data) {
        if (err) {
            next(err)
            return
        }
        res.send({ code: 200, record: data[0] })
    })
})

/**
 * @swagger
 * /api/menu/update:
 *   post:
 *     summary: 更新菜单项
 *     description: 根据菜单 ID 更新菜单项的详细信息。
 *     tags: [Menu]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               id:
 *                 type: integer
 *                 description: 菜单 ID。
 *                 example: 1
 *               name:
 *                 type: string
 *                 description: 菜单名称。
 *                 example: 更新后的菜单项
 *               linkUrl:
 *                 type: string
 *                 description: 菜单链接地址。
 *                 example: "/dashboard"
 *               openType:
 *                 type: string
 *                 description: 打开类型。
 *                 example: "_blank"
 *               icon:
 *                 type: string
 *                 description: 菜单图标。
 *                 example: "icon-dashboard"
 *               isOfAdmin:
 *                 type: boolean
 *                 description: 是否为管理员菜单。
 *                 example: false
 *     responses:
 *       200:
 *         description: 更新成功，返回状态码。
 */
router.post('/update', function (req, res, next) {
    const sql = 'update menu set `name`=?,`linkUrl`=?,`openType`=?,`icon`=?,`isOfAdmin`=? where `id`=?'
    const { id, name, linkUrl, openType, icon, isOfAdmin } = req.body
    sqlFn(sql, [name, linkUrl, openType, icon, isOfAdmin, id], function (err, data) {
        if (err) {
            next(err)
            return
        }
        if (data.affectedRows) {
            res.send({ code: 200, success: true })
        }
    })
})

/**
 * @swagger
 * /api/menu/delete:
 *   post:
 *     summary: 删除菜单项
 *     description: 根据菜单 ID 删除菜单项，如果存在子菜单则提示无法删除。
 *     tags: [Menu]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               id:
 *                 type: integer
 *                 description: 菜单项 ID。
 *                 example: 1
 *     responses:
 *       200:
 *         description: 删除成功。
 *       400:
 *         description: 删除失败，存在子菜单。
 */
router.post('/delete', function (req, res, next) {
    const sql = 'select * from menu where `pid`=?'
    sqlFn(sql, [req.body.id], function (err, data) {
        if (err) {
            next(err)
            return
        }
        if (data && data.length) {
            res.send({ code: '-1', message: '该菜单不能删除，请先删除子菜单' })
        } else {
            const sql = 'delete from menu where `id`=?'
            sqlFn(sql, [req.body.id], function (err, data) {
                if (err) {
                    next(err)
                    return
                }
                if (data.affectedRows) {
                    res.send({ code: 200, success: true })
                }
            })
        }
    })
})

module.exports = router
